package modelo.test;

import java.util.Collection;
import java.util.Iterator;

import junit.framework.TestCase;
import junit.framework.TestSuite;
import modelo.enemigos.CreadorCucaracha;
import modelo.enemigos.CreadorEnemigo;
import modelo.enemigos.CreadorHormiga;
import modelo.enemigos.Enemigo;
import modelo.enemigos.ManejadorEnemigos;
import modelo.juego.Configuracion;
import modelo.juego.Jugador;
import modelo.mapa.Casillero;
import modelo.mapa.Mapa;
import modelo.torres.CreadorTorre;
import modelo.torres.CreadorTorreBlanca;
import modelo.torres.CreadorTorreDorada;
import modelo.torres.CreadorTorrePlateada;
import modelo.torres.ManejadorTorres;
import modelo.torres.Torre;

public class PruebaManejadorTorres extends TestCase {

	private Mapa m;
	private Jugador j;
	private ManejadorEnemigos e;
	private ManejadorTorres mt;

	/*public void setUp() {
		m = new Mapa(Configuracion.TAMANIO_MAPA);
		m.setCamino();
		j = new Jugador();
	}*/
	public void testManejadorTorres() {
		m = new Mapa(Configuracion.TAMANIO_MAPA);
		m.setCamino();
		j = new Jugador();
		CreadorEnemigo tipoEnemigo = new CreadorHormiga();
		e = new ManejadorEnemigos(m, j, Configuracion.VELOCIDAD_DE_TURNO,
				tipoEnemigo);
		mt = new ManejadorTorres(m, e, j);

		assertNotNull(mt);
	}

	public void testCrearTorreBlanca() {
		m = new Mapa(Configuracion.TAMANIO_MAPA);
		m.setCamino();
		j = new Jugador();
		Casillero c = this.m.GetCasilleroXY(2, 4);
		c.setEsCamino(false);
		Collection<Torre> torres;
		Torre t;
		CreadorTorre creadorTBlanca = new CreadorTorreBlanca();

		j.modificarDinero(500);

		CreadorEnemigo tipoEnemigo = new CreadorHormiga();
		e = new ManejadorEnemigos(m, j, Configuracion.VELOCIDAD_DE_TURNO,
				tipoEnemigo);

		mt = new ManejadorTorres(m, e, j);
		mt.crearTorre(c, creadorTBlanca);
		torres = mt.getTorres();
		assertTrue(!(torres.isEmpty()));

		Iterator<Torre> it = torres.iterator();
		t = it.next();

		assertEquals(Configuracion.DANIO_TORRE_BLANCA, t.getDanio());
		assertEquals(Configuracion.ALCANCE_TORRE_BLANCA, t.getAlcance());
		assertEquals(Configuracion.COSTO_TORRE_BLANCA, t.getCosto());
	}

	public void testCrearTorreDorada() {
		m = new Mapa(Configuracion.TAMANIO_MAPA);
		
		j = new Jugador();
		Casillero c = this.m.GetCasilleroXY(1, 1);
		//c.setEsCamino(false);
		
		Collection<Torre> torres;
		Torre t;
		CreadorTorre creadorTDorada = new CreadorTorreDorada();

		j.modificarDinero(50000);

		CreadorEnemigo tipoEnemigo = new CreadorHormiga();
		e = new ManejadorEnemigos(m, j, Configuracion.VELOCIDAD_DE_TURNO,
				tipoEnemigo);

		mt = new ManejadorTorres(m, e, j);
		torres = mt.getTorres();
		System.out.println(torres.size());
		mt.crearTorre(c, creadorTDorada);
		assertTrue(!mt.getTorres().isEmpty());
		
		Iterator<Torre> it = torres.iterator();
		t = it.next();

		assertEquals(Configuracion.DANIO_TORRE_DORADA, t.getDanio());
		assertEquals(Configuracion.ALCANCE_TORRE_DORADA, t.getAlcance());
		assertEquals(Configuracion.COSTO_TORRE_DORADA, t.getCosto());
	}

	public void testCrearTorrePlateada() {
		m = new Mapa(Configuracion.TAMANIO_MAPA);
		m.setCamino();
		j = new Jugador();
		
		Casillero c = this.m.GetCasilleroXY(2, 6);
		c.setEsCamino(false);
		Collection<Torre> torres;
		Torre t;
		CreadorTorre creadorTPlateada = new CreadorTorrePlateada();

		j.modificarDinero(500);

		CreadorEnemigo tipoEnemigo = new CreadorHormiga();
		e = new ManejadorEnemigos(m, j, Configuracion.VELOCIDAD_DE_TURNO,
				tipoEnemigo);

		mt = new ManejadorTorres(m, e, j);
		mt.crearTorre(c, creadorTPlateada);
		torres = mt.getTorres();
		assertTrue(!(torres.isEmpty()));

		Iterator<Torre> it = torres.iterator();
		t = it.next();

		assertEquals(Configuracion.DANIO_TORRE_PLATEADA, t.getDanio());
		assertEquals(Configuracion.ALCANCE_TORRE_PLATEADA, t.getAlcance());
		assertEquals(Configuracion.COSTO_TORRE_PLATEADA, t.getCosto());
	}

	public void testLatir() {
		//m.setCamino();
		m = new Mapa(Configuracion.TAMANIO_MAPA);
		m.setCamino();
		j = new Jugador();
		CreadorTorre creadorTorre = new CreadorTorreDorada();
		CreadorEnemigo tipoEnemigo = new CreadorCucaracha();

		e = new ManejadorEnemigos(m, j, 2, tipoEnemigo);
		mt = new ManejadorTorres(m, e, j);

		// lleno algunos casilleros con torres
		for (int i = 0; i < Configuracion.TAMANIO_MAPA - 1; i = i + 4) {
			Casillero c = this.m.GetCasilleroXY(i, 2);
			mt.crearTorre(c, creadorTorre);
		}
		
		System.out.println(mt.getTorres().size());
		for (int i = 0; i <= 12; i++) {
			e.latir();
		}

		Collection<Enemigo> enemigos = e.getListaEnemigos();
		assertTrue(1 == enemigos.size());

		Iterator<Enemigo> it = enemigos.iterator();
		Enemigo enemigo = it.next();

		for (int i = 0; i < 12; i++) {
			mt.latir();
		}

		if (1 == enemigos.size()) {
			assertTrue(Configuracion.RESISTENCIA_CUCARACHA > enemigo.getResistencia());
		} else {
			assertTrue(enemigo.getResistencia() <= 0);
		}
	}

	public static TestSuite suite() {
		TestSuite suite = new TestSuite();
		suite.addTestSuite(PruebaManejadorTorres.class);
		return suite;
	}
}
